package com.shrio.lucene;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

import java.io.File;
import java.io.IOException;

/**
 * Created by luojie on 2018/4/24.
 */
public class SearcherTest1 {

    public static void main(String[] args) {
        try {
            //1、创建Directory
            Directory directory = FSDirectory.open(new File("G:\\index"));

            //创建索引读取器
            IndexReader reader= DirectoryReader.open(directory);
            //创建索引查询器
            IndexSearcher searcher=new IndexSearcher(reader);
            // 标准分词器
//            Analyzer analyzer=new StandardAnalyzer();

            IKAnalyzer analyzer = new IKAnalyzer(true);
            //4、创建索引的Query
            /** QueryParser会使用分词器对用户输入的文本进行分词得到N个Term,然后再根据匹配的
             * analyzer即分词器对象，用户输入的搜索关键字我们需要对其分词，为什么要分词？
             * 因为用户输入的搜索关键字可能是一句话，比如：
             * 我女朋友要跟我分手，我该怎么办，
             * 分词后可能得到的只有两个关键字就是女朋友和分手，其他都是停用词被剔除了
             */
            QueryParser parser = new QueryParser("content",analyzer);
            //表示搜索content中包含java的文档
//            Query query = parser.parse("电机");

            String parm = "电饭煲";
            parm = "\"" + parm + "\"";

//            Query query = parser.parse("\"电饭煲\"");//整词查找
            /**
             * 查询的时候是将“格力手机”分成了“格力”和“手机”来查询，也许还有 力手
             */
            Query query = parser.parse("格力空调");
            System.out.println(">>>>>>>>>>" + query);

            //5、根据searcher搜索并返回TopDocs
            //表示返回前面10条
            TopDocs topDocs = searcher.search(query,10);
            //6、根据TopDocs获取ScoreDoc对象
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;
            for(ScoreDoc sd : scoreDocs){
                //7、根据Searcher和ScordDoc对象获取具体的Document对象
                //获取这个文档的id
                int doc = sd.doc;
                Document document = searcher.doc(doc);
                //8、根据Document对象获取需要的值
                System.out.println("【找到】" + document.get("fileName") + "    " + document.get("path") + " .." + document.get("content"));
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }

    }
}
